访问修饰符 public & private

在 C#中,访问修饰符指定了类成员(属性、方法、字段等)的可见性和访问级别。C#中有四种访问修饰符:public、private、protected 和 internal。

public 修饰符

public 是一种最常用的访问修饰符,用于指定成员是公共的,可以在任何地方访问。也就是说,public 成员可以从该成员所在的类的任何位置,以及该类的对象的任何位置进行访问。

public class MyClass
{
    public int myPublicInt;
}

在这个示例中,我们定义了一个公共类 MyClass,并在该类中定义了一个公共整型变量 myPublicInt。这意味着 myPublicInt 可以在该类的任何位置进行访问,也可以通过该类的对象在其他地方进行访问。

private 修饰符

private 是一种访问修饰符,用于限制只有在当前类中才能访问该成员,其他类或子类均无法访问该成员。具体来说,被 private 修饰的成员只能在声明该成员的类内部使用。

public class MyClass
{
    private int count; // private 成员

    public void IncrementCount()
    {
        count++; // 可以在类内部访问 private 成员
    }

    public void PrintCount()
    {
        Console.WriteLine(count); // 可以在类内部访问 private 成员
    }
}

public class MyOtherClass
{
    public void DoSomething()
    {
        MyClass myClass = new MyClass();
        // 以下代码会报错,因为 MyOtherClass 无法访问 MyClass 中的 private 成员
        Console.WriteLine(myClass.count);
    }
}

在上面的代码中,MyClass 类中的 count 字段被 private 修饰,因此只能在该类内部使用。MyOtherClass 类无法访问 count 字段,因为它不是 MyClass 类。

使用 private 修饰符可以隐藏类的内部实现细节,从而提高代码的安全性和可维护性。通常情况下,我们会将类的字段都设置为 private,并提供公共的方法来访问和修改这些字段。这种做法可以防止其他类直接修改类的内部字段,从而保护类的数据和状态的完整性。

总结

  • public 修饰符指定成员是公共的,可以在任何地方访问。
  • private 修饰符指定成员是私有的,只能在该成员所在的类的内部访问。
  • 选择使用哪个访问修饰符,应该根据类的设计目的和功能需求来决定。通常情况下,应该尽量将成员的可见性降低到最低限度,以避免不必要的访问和潜在的错误。

protected 修饰符

public class Animal
{
    protected string name; // protected 成员

    public void SetName(string name)
    {
        this.name = name;
    }
}

public class Cat : Animal
{
    public void PrintName()
    {
        Console.WriteLine(name); // 在子类中可以访问父类的 protected 成员
    }
}

public class Dog
{
    public void PrintName()
    {
        Animal animal = new Animal();
        // 下面这行代码会报错,因为 Dog 类不能访问 Animal 类中的 protected 成员
        Console.WriteLine(animal.name);
    }
}

internal 修饰符

// 在同一程序集中的两个类
public class MyClass
{
    internal string name; // internal 成员

    public void PrintName()
    {
        Console.WriteLine(name);
    }
}

public class MyOtherClass
{
    public void DoSomething()
    {
        MyClass myClass = new MyClass();
        // 在同一程序集中的类可以访问 internal 成员
        Console.WriteLine(myClass.name);
    }
}
// 在另一个程序集中的类
public class MyExternalClass
{
    public void DoSomething()
    {
        MyClass myClass = new MyClass();
        // 以下代码会报错,因为 MyExternalClass 不在同一程序集中,无法访问 internal 成员
        Console.WriteLine(myClass.name);
    }
}